package com.swyc.osschat.Test.designMode.decorate.run;

import com.swyc.osschat.Test.designMode.decorate.base.Dog;
import com.swyc.osschat.Test.designMode.decorate.strategy.DogDecorator;
import com.swyc.osschat.Test.designMode.decorate.strategy.DogImpl;

/**
 * @description Java 装饰模式
 * 一、定义
 *      在不必改变原类文件和原类使用的继承的情况下，动态地扩展一个对象的功能。它是通过创建一个包装对象，也就是用装饰来包裹真实的对象来实现。
 *  主要角色：
 *      抽象构件：定义一个抽象接口以规范准备接收附加责任的对象。
 *      具体构件：实现抽象构件，通过装饰角色为其添加一些职责。
 *      抽象装饰：继承或实现抽象构建，并包含具体构建的实例，可以通过其子类扩展具体构件的功能。
 *      具体装饰：实现抽象装饰的相关方法，并给具体构件对象添加附加的责任。
 * 二、代码实现
 *      举例：比如有一条狗，只会吃饭睡觉，不会看门，此时可以通过装饰器模式为这条狗附加看门的功能。
 * 一般情况下我们扩展一个类的时候通常是通过继承的方式来实现，随着扩展的功能的增多，子类也会越来越多，此时我们就可以应用装饰器模式，通过一个装饰类来包装原有的类，并保持原有类不发生改变的情况下，提供了额外的功能。
 * @Author: z156940l@outlook.com
 * @className Test
 * @Date: 2022/6/27 15:19
 */
public class Test {

    public static void main(String[] args) {
        System.out.println("=====装饰前========");
        Dog dog = new DogImpl();
        dog.function();
        System.out.println("=====装饰后========");
        Dog dog2 = new DogDecorator(dog);
        dog2.function();
    }
}
